/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.trandio.manager;

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import org.trandio.dao.PlanosDAO;
import org.trandio.dao.PlanosInterface;
import org.trandio.model.AuxiliarPlanoVO;
import org.trandio.model.PacienteVO;
import org.trandio.model.PlanoPacienteVO;

/**
 *
 * @author Administrador
 */
public class CargarPlanoPacientes {
/**
     * Lee el fichero CSV llamado pathFichero, usando como delimitador de
     * columnas: "delimitador" y crea una lista en memoria de
     * Objetos de tipo PacienteVO
     * @param pathFichero
     * @param delimitador
     * @return
 */


    PlanosInterface planosInterface;
    PlanoPacienteVO planoPacienteVO;
    AuxiliarPlanoVO auxiliarPlanoVO;


    public int leePlanoPacientes(String pathFichero, String delimitador, String nomfile)
    throws Exception {

        CsvReader cvsReader = null;
        planosInterface = new PlanosDAO();



       try {

       File fichero = new File(pathFichero);
       FileReader freader = new FileReader(fichero);
       cvsReader = new CsvReader(freader,delimitador.charAt(0));
       String[] headers = null;
       int numeroErrores = 0;


       //List listaRegistros = new ArrayList();
     // Leemos las cabeceras del fichero (primera fila).



       /*if(cvsReader.readHeaders()) {
            headers = cvsReader.getHeaders();
            for(int i=0;i<headers.length;i++) {
                 System.out.println(headers[i]);
             }
       }
       */

       // Leemos los registros
       //System.out.println("------- PALABRAS DEL FICHERO ------------");


       int numeroLinea = 1;
       int numeroColumnas=0;
       numeroColumnas = planosInterface.getNumeroColumnas();

       FileWriter archivo = null;
       PrintWriter pw = null;

       archivo = new FileWriter("/tmp/err_"+nomfile+"",false);
       pw = new PrintWriter(archivo);

       int totErrores = 0;

           while (cvsReader.readRecord()) {               

               int errores = 0;
               String cadenaError = "";


               String identificacion = cvsReader.get(0);
               String nombre1 = cvsReader.get(1);


               //EVALUA EL NUMERO DE CAMPOS
               if (cvsReader.getColumnCount() > numeroColumnas) {
                   //System.out.println("El registro tiene mas columnas de las configuradas");

                   cadenaError += " [El registro tiene mas columnas de las configuradas]";

                   errores = errores+1;
               }

               if (cvsReader.getColumnCount() < numeroColumnas) {
                   //System.out.println("Linea:" + numeroLinea + " El registro tiene menos columnas de las configuradas");
                   cadenaError += " [El registro tiene menos columnas de las configuradas]";
                   errores = errores+1;
               }



               for (int i = 0; i < cvsReader.getColumnCount(); i++) {
                   //System.out.println(cvsReader.get(i));
                    planoPacienteVO = new PlanoPacienteVO();
                    planoPacienteVO = planosInterface.getValidarRequerido(i);

                   if (cvsReader.get(i).equals("")) {
                       if (planoPacienteVO.isRequerido()) {
                           //System.out.println("El valor para el campo: " + planoPacienteVO.getCampo() + " es requerido");
                           cadenaError += " [El valor para el campo: " + planoPacienteVO.getCampo() + " es requerido]";
                           errores = errores+1;
                       }
                   }
                   else{
                        if(!(planoPacienteVO.getTabla_referencia()==null)){
                            boolean cruza = planosInterface.validarReferencia(planoPacienteVO.getTabla_referencia(),
                                                                              planoPacienteVO.getCampo_referencia(),
                                                                              cvsReader.get(i));
                            if(!cruza){
                                //System.out.println("El valor del campo: " + planoPacienteVO.getCampo() + " no es valido");
                                cadenaError += " [El valor del campo: " + planoPacienteVO.getCampo() + " no es valido]";
                                errores = errores+1;
                            }
                            
                        }
                   }

               }

               
              if(errores>0)
               pw.println("Linea "+numeroLinea+": Se presentaron "+errores+" errores en la validación: "+cadenaError);

               //System.out.println("Linea "+numeroLinea+": Se presentaron "+errores+" errores en la validación: "+cadenaError);

               /*
               PacienteVO pacienteVO = new PacienteVO();
               pacienteVO.setNumero_identificacion(identificacion);
               pacienteVO.setNombre1(nombre1);
               listaRegistros.add(pacienteVO);
               */

               totErrores = totErrores +errores;
               numeroErrores = errores;
               numeroLinea++;
           }

       archivo.close();

       /*
       File archivoErr = new File("/tmp/err_"+nomfile+".txt");
       if(numeroErrores==0){
            archivoErr.delete();
       }
       */

       //System.out.println("---------->"+errores);

     return totErrores;
    } catch(Exception e) {
            throw e;
    }  finally {
        if(cvsReader!=null) {
            cvsReader.close();
        }
    }
  }


public void escribePlanoPacientes(String pathFichero, String delimitador) throws Exception{
       CsvReader cvsReader = null;
        planosInterface = new PlanosDAO();



       try {

       File fichero = new File(pathFichero);
       FileReader freader = new FileReader(fichero);
       cvsReader = new CsvReader(freader,delimitador.charAt(0));
       String[] headers = null;
       int numeroErrores = 0;


       //List listaRegistros = new ArrayList();
     // Leemos las cabeceras del fichero (primera fila).



       /*if(cvsReader.readHeaders()) {
            headers = cvsReader.getHeaders();
            for(int i=0;i<headers.length;i++) {
                 System.out.println(headers[i]);
             }
       }
       */

       // Leemos los registros
       //System.out.println("------- PALABRAS DEL FICHERO ------------");


       int numeroLinea = 1;
       int numeroColumnas=0;
       numeroColumnas = planosInterface.getNumeroColumnas();



           while (cvsReader.readRecord()) {

               String insert = "";
               String values = "";

               for (int i = 0; i < cvsReader.getColumnCount(); i++) {
                   //System.out.println(cvsReader.get(i));
                    planoPacienteVO = new PlanoPacienteVO();
                    planoPacienteVO = planosInterface.getValidarRequerido(i);
                    auxiliarPlanoVO = new AuxiliarPlanoVO();

                    String dato = cvsReader.get(i);



                    if(!(planoPacienteVO.getTabla_referencia()==null)){
                           auxiliarPlanoVO = planosInterface.getReferencia(planoPacienteVO.getTabla_referencia(),
                                                                              planoPacienteVO.getCampo_referencia(),
                                                                              cvsReader.get(i));
                           int id = auxiliarPlanoVO.getId();
                           dato = String.valueOf(id);
                        }

                    insert += planoPacienteVO.getCampo()+",";
                    values += "'"+dato+"',";
               }


               int insertLen = insert.length();
               int valuesLen = values.length();


               String cadInsert = "INSERT INTO tb_paciente("+insert.substring(0, insertLen-1)+")"+
                                  "VALUES ("+values.substring(0, valuesLen-1)+")";


               System.out.println(cadInsert);


               planosInterface.insertarPacientePlano(cadInsert);

               

               //System.out.println("Linea "+numeroLinea+": Se presentaron "+errores+" errores en la validación: "+cadenaError);

               /*
               PacienteVO pacienteVO = new PacienteVO();
               pacienteVO.setNumero_identificacion(identificacion);
               pacienteVO.setNombre1(nombre1);
               listaRegistros.add(pacienteVO);
               */

           }

       /*
       File archivoErr = new File("/tmp/err_"+nomfile+".txt");
       if(numeroErrores==0){
            archivoErr.delete();
       }
       */

       //System.out.println("---------->"+errores);

    } catch(Exception e) {
            throw e;
    }  finally {
        if(cvsReader!=null) {
            cvsReader.close();
        }
    }
    }


}
